home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Internet Info 1994 March
/
Internet Info CD-ROM (Walnut Creek) (March 1994).iso
/
networking
/
ip
/
ka9q
/
src890906.arc
/
LAPBTIME.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-08-19
|
2KB
|
109 lines
#include "global.h"
#include "mbuf.h"
#include "ax25.h"
#include "timer.h"
#include "lapb.h"
static void tx_enq __ARGS((struct ax25_cb *axp));
/* Called whenever timer T1 expires */
void
recover(p)
void *p;
{
register struct ax25_cb *axp;
axp = (struct ax25_cb *)p;
axp->t1.start *= 2; /* Back off retransmit timer */
axp->flags.retrans = 1;
switch(axp->state){
case SETUP:
if(axp->n2 != 0 && axp->retries == axp->n2){
free_q(&axp->txq);
axp->reason = LB_TIMEOUT;
lapbstate(axp,DISCONNECTED);
} else {
axp->retries++;
sendctl(axp,COMMAND,SABM|PF);
start_timer(&axp->t1);
}
break;
case DISCPENDING:
if(axp->n2 != 0 && axp->retries == axp->n2){
axp->reason = LB_TIMEOUT;
lapbstate(axp,DISCONNECTED);
} else {
axp->retries++;
sendctl(axp,COMMAND,DISC|PF);
start_timer(&axp->t1);
}
break;
case CONNECTED:
axp->retries = 0;
case RECOVERY: /* note fall-thru */
if(axp->n2 != 0 && axp->retries == axp->n2){
/* Give up */
sendctl(axp,RESPONSE,DM|PF);
free_q(&axp->txq);
axp->reason = LB_TIMEOUT;
lapbstate(axp,DISCONNECTED);
} else {
/* Transmit poll */
tx_enq(axp);
axp->retries++;
lapbstate(axp,RECOVERY);
}
break;
}
}
/* Send a poll (S-frame command with the poll bit set) */
void
pollthem(p)
void *p;
{
register struct ax25_cb *axp;
axp = (struct ax25_cb *)p;
if(axp->proto == V1)
return; /* Not supported in the old protocol */
switch(axp->state){
case CONNECTED:
axp->retries = 0;
tx_enq(axp);
lapbstate(axp,RECOVERY);
break;
}
}
/* Transmit query */
static void
tx_enq(axp)
register struct ax25_cb *axp;
{
char ctl;
struct mbuf *bp;
/* I believe that retransmitting the oldest unacked
* I-frame tends to give better performance than polling,
* as long as the frame isn't too "large", because
* chances are that the I frame got lost anyway.
* This is an option in LAPB, but not in the official AX.25.
*/
if(axp->txq != NULLBUF
&& (len_mbuf(axp->txq) < axp->pthresh || axp->proto == V1)){
/* Retransmit oldest unacked I-frame */
dup_p(&bp,axp->txq,0,len_mbuf(axp->txq));
ctl = PF | I | ((axp->vs - axp->unack) & MMASK) << 1
| axp->vr << 5;
sendframe(axp,COMMAND,ctl,bp);
} else {
ctl = len_mbuf(axp->rxq) >= axp->window ? RNR|PF : RR|PF;
sendctl(axp,COMMAND,ctl);
}
axp->response = 0;
stop_timer(&axp->t3);
start_timer(&axp->t1);
}